package ms.demo001;


import org.junit.Test;

public class Client2 {

    /**
     * Java的 hotspot虚拟机是基于栈架构的。
     * 操作数先在局部变量表中保存，并在计算时候先压入栈，在栈中计算完毕后
     *
     */
    @Test
    public void testCase1() {
        int i = 1; // 局部变量表 i=1
        /**
         * 执行计算时，CPU把i=1读入操作数栈，并进行i+1(i++)计算,这样局部变量i变成2（栈中i不受影响，依旧为i=1），再来执行赋值操作,
         * 将栈顶i=1赋值给等号左边局部变量i（赋值是个弹栈操作，因此赋值完毕，操作数栈顶也就没有数据了），使得局部变量表i的值变回1。
         */
        i = i++;
//        System.out.println("i=====>" + i); // 1
        /**
         * i=1先入操作数栈，然后局部变量i（=i+1）=2(先入栈的i不受影响，i依旧为1，但局部变量i=2)，再执行赋值操作，将i=1赋值给j，j=1，
         */
        int j = i++;
//        System.out.println("j===>" + j); // 1
        //int k = i + ++i * i++;
        /**
         * i在入操作数栈前，局部变量i要先+1（++i），此时i=3（2+1）并i=3入栈；
         * 再来执行i++：这个是i先入栈再来进行局部变量i+1，从局部变量表得知此时入栈的i=3，入栈后i=4；
         * 最终局部变量i=4，最终计算结果是：3*3+4 ，栈底->栈顶：
         * 4,
         * 3,
         * 3,
         * 如何先计算乘法，再计算加法？栈的特点是先进后出，先入栈的是两个乘数，如何取出计算呢？
         *
         * 计算并赋值操作完毕后，操作数栈还原为计算前状态。
         */
        int k = ++i * i++ + i;
        System.out.println("i=" + i); // 4
        System.out.println("j=" + j); // 1
        System.out.println("k=" + k); // 13
    }
}
